void main() {
  //Dart2的异常是Exception或者Error（包括它们的子类）的类型，甚至可以是非Exception或者Error类，也可以抛出比如下面的test方法，但是不建议这么使用。
  //Exception主要是程序本身可以处理的异常，比如：IOException。我们处理的异常也是以这种异常为主。
  //Error是程序无法处理的错误，表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关，而表示代码运行时 DartVM出现的问题。比如：内存溢出(OutOfMemoryError)等等。

  //1、throw异常，Exception为抽象类，内部有个默认实现_Exception，可以自定义Exception，如下面的MyException
//  throw new MyException();
  //2、try on
  int x = 12;
  int y = 0;
  int res;
  try {
    res = x ~/ y; // ~/取商   %取余
  } on IntegerDivisionByZeroException {
    print('Cannot divide by zero');
  }
  //3、try catch
  try {
    res = x ~/ y;
  } catch (e) {
    print(e);
  }
  //4、try on catch
  try {
    res = x ~/ y;
  } on IntegerDivisionByZeroException catch (e) {
    print(e);
  }
  //5、finally
  try {
    res = x ~/ y;
  } on IntegerDivisionByZeroException {
    print('Cannot divide by zero');
  } finally {
    print('Finally block executed');
  }
  // 6、rethrow可用来传导异常
  try {
    testThrow();
  } catch (e) {
    print(e);
  }

  try {
    testRethrow();
  } catch (e) {
    print(e);
  }

  //7、异步异常不可捕获，因为生产Future起见未发生异常，只能通过Future的catchError或者通过Zone捕获
  try {
    Future.delayed(Duration(seconds: 1))
        .then((_) => throw Exception('message1'))
        .then((e) => Future.error('message'));
  } catch (e) {
    print(e);
  }
}

testThrow() {
  throw 11;
}

testRethrow() {
  int x = 12;
  int y = 0;
  int res;
  try {
    res = x ~/ y;
  } on IntegerDivisionByZeroException {
    rethrow;
  }

}

//dart中Exception作为接口出现，必须用implements
class MyException implements Exception {
  // can contain constructors, variables and methods
}
